#在windows系统下监控指定的端口， 发现端口不能正常访问， 杀死指定进程，并重启指定的应用，把事件记录入操作系统的应用日志
#相当于一个守护进程， 在计划任务里， 每5分钟自动执行
import socket
import os
import time
import win32evtlog
import win32evtlogutil


#监控的主机，本机的话127.0.0.1
ip='127.0.0.1'
#监控的端口
port=80
#出现问题后要杀掉的进程名字，可以通过“Task manager”查询,杀进程的命令 taskkill /f /t /im xxx.exe
process_name="rinetd.exe"
#杀完进程后，从哪里重新启动应用， 注意写法，双斜杠
start_new="C:\\TEMP\\rinetd\\rinetdbat.bat"


#把日志写入操作系统的应用日志中的函数
def application_log(str1,str2):
    applicationName = "python-watchdog"
    #应用日志ID
    eventID = 60002
    category = 4	# Shell
    myType = win32evtlog.EVENTLOG_INFORMATION_TYPE
    descr = [str1,str2]
    win32evtlogutil.ReportEvent(applicationName, eventID,eventType=myType, strings=descr)

#尝试连接主机和端口    
sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sk.settimeout(1)
try:
    #成功的话，pass不作任何操作
    sk.connect((ip,port))
    sk.close()
    print("server port connect OK! ")
except Exception:
    #失败的话，杀进程，并启动新程序，并记录入操作系统的应用日志
    sk.close()
    application_log('server','server port not connect!,restart application')
    print("server port not connect!")
    os.system('taskkill /f /t /im {}'.format(process_name))
    time.sleep(5)
    os.system("start {}".format(start_new))

